package enumdemo;
//          枚举
//优点：1. 枚举常量更简单安全 。2. 枚举具有内置方法 ，代码更优雅
//缺点：1. 不可继承，无法扩展

//  Enum类的常用方法
//  values()以数组形式返回枚举类型的所有成员
//  ordinal()获取枚举成员的索引位置
//  valueOf()将普通字符串转换为枚举实例
//  compareTo()比较两个枚举成员在定义时的顺序



public enum TestEnum {
//    枚举对象  是属于对象的后面可以加括号 如果需要添加内容 需要添加构造方法
    RED(0,"Red"),BLACK(),GREEN,WHITE;

    public String color;
    public int ordinal;
    TestEnum(){

    }
    private TestEnum(int ordinal,String color){
        this.ordinal = ordinal;
        this.color = color;
    }

//    public TestEnum(){}  如果加public会报错
//    private TestEnum(){}  如果加private会报错  private是灰色的
//    自己写的枚举不仅默认继承Enum
//    此时构造方法 默认是私有的



    public static void main1(String[] args) {
        System.out.println(TestEnum.RED);//如果不是在同一个类类名调用
        System.out.println(RED);
        System.out.println(RED.color);
//        打印
//          RED
//          RED
//          Red
    }

    public static void main2(String[] args) {
        TestEnum testEnum = TestEnum.BLACK;//black
        switch (testEnum) {
            case RED:
                System.out.println("red");
                break;
            case BLACK:
                System.out.println("black");
                break;
            case WHITE:
                System.out.println("white");
                break;
            case GREEN:
                System.out.println("green");
                break;
            default:
                break;
        }
    }

    public static void main3(String[] args) {
        TestEnum[] testEnum = TestEnum.values();
//        问题：在TestEnum类中 并没有values()方法 该方法哪里的
//        这个枚举实际上是由java.lang.Enum这个类实现的，在程序中定义的枚举类型，都会隐式继承此类。
//        并且，由于java中的继承是单继承，所以我们定义的枚举就无法在继承其他类了。
//        总结：
//          1.java中的enum关键字背后实际是Enum这个类实现的。
//          2.在我们编写自定义的enum时，其中是不含values方法的，再编译java文件时，java编译器会自动帮助我们生成这个方法。
        for (int i = 0; i < testEnum.length; i++) {
            System.out.println(testEnum[i] + "->" + testEnum[i].ordinal());
//              RED->0
//              BLACK->1
//              GREEN->2
//              WHITE->3
        }
    }


    public static void main4(String[] args) {
//        把字符串变成对应的枚举对象
        TestEnum testEnum = TestEnum.valueOf("RED");
//        TestEnum testEnum2 = TestEnum.valueOf("green");//error
        System.out.println(testEnum);//RED
//        System.out.println(testEnum2);//No enum constant enumdemo.TestEnum.green


        System.out.println(RED.compareTo(GREEN));//-2   默认索引进行比较
        System.out.println(RED.compareTo(BLACK));//-1
    }


}
